package com.william.jdbcplus.core.condition.lambda;

import com.william.jdbcplus.core.toolkit.lambda.support.SFunction;

import java.io.Serializable;

/**
 * From 片段
 *
 * @author niliwei
 */
public interface From<Wrap> extends Serializable {
    /**
     * 查询表 from table
     *
     * @param clazz 类名
     * @return
     */
    Wrap from(Class<?> clazz);

    /**
     * 查询表 from table
     *
     * @param table 表名
     * @return
     */
    Wrap from(String table);

    /**
     * 连接
     *
     * @param r1 左列
     * @param r2 右列
     * @return
     */
    <R, R2> Wrap join(Class<R> clazz, SFunction<R, ?> r1, SFunction<R2, ?> r2);

    /**
     * 内连接
     *
     * @param r1 左列
     * @param r2 右列
     * @return
     */
    <R, R2> Wrap innerJoin(Class<R> clazz, SFunction<R, ?> r1, SFunction<R2, ?> r2);

    /**
     * 左连接
     *
     * @param r1 左列
     * @param r2 右列
     * @return
     */
    <R, R2> Wrap leftJoin(Class<R> clazz, SFunction<R, ?> r1, SFunction<R2, ?> r2);

    /**
     * 右连接
     *
     * @param r1 左列
     * @param r2 右列
     * @return
     */
    <R, R2> Wrap rightJoin(Class<R> clazz, SFunction<R, ?> r1, SFunction<R2, ?> r2);

//    /**
//     * 全连接 删除 因为 mysql 不支持 full join
//     *
//     * @param r1 左列
//     * @param r2 右列
//     * @return
//     */
//    <R, R2> Wrap fullJoin(Class<R> clazz, SFunction<R, ?> r1, SFunction<R2, ?> r2);

}
